#include <iostream>

using namespace std;

//还是使用递归的思想，检索第i个人时将和他在同一个朋友圈的a[i][j]与a[j][i]设为0，防止后面检索时重复计数
//同时这里为了判断每一个人是不是有自己的朋友圈又新设立了一个bin的数组原来存放他们的id，但是如果这个人有朋友，
//这个bin中相应的标号就会改变用这个就可以进行朋友圈的计数
void counting(int **a,int *b,int i,int lenth)
{
    //cout<<i<<"第个人的朋友圈"<<endl;
    for(int j=0;j<lenth;j++){
        if(i==j){continue;}
        else if(a[i][j]==1)
        {
            a[j][i]=0;
            a[i][j]=0;
            counting(a,b,j,lenth);
            b[j]=i;
        }
    }
}

int main()
{
    int x;
    cin>>x;
    int **arr;
    int *bin;
    bin=new int[x];
    for(int i=0;i<x;i++){
        bin[i]=i;
    }
    arr=new int*[x];
    for(int i=0;i<x;i++){
        arr[i]=new int[x];
    }
    for(int i=0;i<x;i++){
        for(int j=0;j<x;j++){
            cin>>arr[i][j];
        }
        arr[i][i]=0;
    }

    int lable=0;
    for(int i=0;i<x;i++){
        counting(arr,bin,i,x);
    }
    for(int i=0;i<x;i++){
        if(bin[i]==i){
            lable++;
        }
    }
    cout<<"一共有"<<lable<<"个朋友圈"<<endl;
    return 0;
}

// FIXME:
//  1. 这个程序需要读入不少的数据，测试的时候很麻烦。可以考虑如何从文件读取数据，这样方便测试程序的正确性。
 
